home *** CD-ROM | disk | FTP | other *** search
/ The Utilities Experience / The Utilities Experience - Volume 1.iso / software / icons+tools / associate_v1.2 / source / guihandler.c < prev    next >
C/C++ Source or Header  |  1995-12-22  |  16KB  |  699 lines

  1. #include <ctype.h>
  2. #include "includes.h"
  3. #include <dos/dostags.h>
  4.  
  5. #include "vars.h"
  6.  
  7. /* This file contains empty template routines that
  8.  * the IDCMP handler will call uppon. Fill out these
  9.  * routines with your code or use them as a reference
  10.  * to create your program.
  11.  */
  12.  
  13. void DoAbout( void )
  14. {
  15.   rtEZRequestTags("Associate, A nice WB Util By Hydra/LSD\n"
  16.                   "\n"
  17.                   "This program is FreeWare! so spread and use it\n"
  18.                   "but do NOT modify it in ANY way at all.\n"
  19.                   "\n"
  20.                   "Permission is GRANTED to use this in\n"
  21.                   "any commercial program, it can also be\n"
  22.                   "included on coverdisks and such like\n",
  23.                   "Cool!",
  24.                   NULL,NULL,RTGS_Flags, GSREQF_CENTERTEXT,
  25.                   RT_Window,AssociateWnd,TAG_END);
  26. }
  27.  
  28. BOOL SelectFile(char *Filename,char *title,char *wildcards)
  29. {
  30.   char *dirname;
  31.   short chars;
  32.   BOOL retval=FALSE;
  33.   strcpy(tmpstr,FilePart(Filename));
  34.  
  35.   chars=(short)((int)PathPart(Filename)-(int)Filename);
  36.   if (dirname=AllocMem(chars+1,MEMF_PUBLIC|MEMF_CLEAR))
  37.   {
  38.     strncpy(dirname,Filename,chars);
  39.     rtChangeReqAttr(filereq,RTFI_MatchPat,wildcards,
  40.                             RTFI_Dir, dirname,
  41.                             TAG_DONE);
  42.  
  43.     if (rtFileRequest (filereq, tmpstr, title,RTFI_Flags,FREQF_PATGAD,TAG_END))
  44.     {
  45.       strcpy(Filename,filereq->Dir);
  46.       AddPart(Filename,tmpstr,MAX_TEMP_STR_LEN);
  47.       retval=TRUE;
  48.     }
  49.     FreeMem(dirname,chars+1);
  50.   }
  51.   return(retval);
  52. }
  53.  
  54. struct TypeNode *FindTypeNode( void )
  55. {
  56.   struct TypeNode *node=NULL;
  57.   LONG num;
  58.  
  59. #ifdef KS30
  60.   if (1==GT_GetGadgetAttrs(AssociateGadgets[GD_TypeList],AssociateWnd,NULL,
  61.                     GTLV_Selected,&num,
  62.                     TAG_DONE))
  63.   {
  64. #endif
  65.  
  66. #ifdef KS20
  67.   num=LastTypeClicked;
  68. #endif
  69.     if (num>=0)
  70.     {
  71.       node=(struct TypeNode *) GetNode(typelist,num);
  72.     }
  73. #ifdef KS30
  74.   }
  75. #endif
  76.   return(node);
  77. }
  78.  
  79. void UpdateLists( void )
  80. {
  81.   GT_SetGadgetAttrs(AssociateGadgets[GD_TypeList], AssociateWnd, NULL,
  82.                     GTLV_Labels, (ULONG)typelist,
  83.                     TAG_END);
  84.  
  85.   if (temptnode=FindTypeNode())
  86.   {
  87. #ifdef KS20
  88.     LastNamePClicked=-1;
  89.     LastFilePClicked=-1;
  90. #endif
  91.     GT_SetGadgetAttrs(AssociateGadgets[GD_NamePList], AssociateWnd, NULL,
  92.                       GTLV_Labels, (ULONG)temptnode->nameplist,
  93.                       TAG_END);
  94.     GT_SetGadgetAttrs(AssociateGadgets[GD_FilePList], AssociateWnd, NULL,
  95.                       GTLV_Labels, (ULONG)temptnode->fileplist,
  96.                       TAG_END);
  97.     GT_SetGadgetAttrs(AssociateGadgets[GD_IconStr], AssociateWnd, NULL,
  98.                       GA_Disabled, FALSE,
  99.                       GTST_String, temptnode->IconName,
  100.                       TAG_END);
  101.     GT_SetGadgetAttrs(AssociateGadgets[GD_IconRun],AssociateWnd,NULL,
  102.                       GA_Disabled, FALSE,
  103.                       GTCB_Checked,temptnode->RunInfo,
  104.                       TAG_DONE);
  105.     GT_SetGadgetAttrs(AssociateGadgets[GD_IconInfo],AssociateWnd,NULL,
  106.                       GA_Disabled, FALSE,
  107.                       TAG_DONE);
  108.   }
  109.   else // blank the lists..
  110.   {
  111.     GT_SetGadgetAttrs(AssociateGadgets[GD_NamePList], AssociateWnd, NULL,
  112.                       GTLV_Labels, NULL,
  113.                       TAG_END);
  114.     GT_SetGadgetAttrs(AssociateGadgets[GD_FilePList], AssociateWnd, NULL,
  115.                       GTLV_Labels, NULL,
  116.                       TAG_END);
  117.     GT_SetGadgetAttrs(AssociateGadgets[GD_IconStr], AssociateWnd, NULL,
  118.                       GA_Disabled, TRUE,
  119.                       GTST_String, NULL,
  120.                       TAG_END);
  121.     GT_SetGadgetAttrs(AssociateGadgets[GD_IconRun],AssociateWnd,NULL,
  122.                       GA_Disabled, TRUE,
  123.                       GTCB_Checked,FALSE,
  124.                       TAG_DONE);
  125.     GT_SetGadgetAttrs(AssociateGadgets[GD_IconInfo],AssociateWnd,NULL,
  126.                       GA_Disabled, TRUE,
  127.                       TAG_DONE);
  128.   }
  129. }
  130.  
  131. int TypeListClicked( void )
  132. {
  133.   /* routine when gadget "File Type" is clicked. */
  134.  
  135. #ifdef KS20
  136.   LastTypeClicked=AssociateMsg.Code;
  137. #endif
  138.   UpdateLists();
  139.   return(1);
  140. }
  141.  
  142. int NamePListClicked( void )
  143. {
  144.   /* routine when gadget "Name Patterns" is clicked. */
  145. #ifdef KS20
  146.   LastNamePClicked=AssociateMsg.Code;
  147. #endif
  148.   return(1);
  149. }
  150.  
  151. int FilePListClicked( void )
  152. {
  153.   /* routine when gadget "File Patterns" is clicked. */
  154. #ifdef KS20
  155.   LastFilePClicked=AssociateMsg.Code;
  156. #endif
  157.   return(1);
  158. }
  159.  
  160. int IconPickClicked( void )
  161. {
  162.   /* routine when gadget "" is clicked. */
  163.  
  164.   if (temptnode=FindTypeNode())
  165.   {
  166.     if (SelectFile(temptnode->IconName,"Select an Icon!","#?.info"))
  167.     {
  168.       GT_SetGadgetAttrs(AssociateGadgets[GD_IconStr], AssociateWnd, NULL,
  169.                         GTST_String, temptnode->IconName,
  170.                         TAG_END);
  171.     }
  172.   }
  173.   return(1);
  174. }
  175.  
  176. int IconStrClicked( void )
  177. {
  178.   /* routine when gadget "Icon Filename" is clicked. */
  179.  
  180.   if (temptnode=FindTypeNode())
  181.   {
  182.     strcpy(temptnode->IconName,GetString(AssociateGadgets[GD_IconStr]));
  183.   }
  184.   return(1);
  185. }
  186.  
  187. void addterm(char *s)
  188. {
  189.   if (s[strlen(s)-1]!=':' && s[strlen(s)-1]!='/') strcat(s,"/");
  190. }
  191.  
  192. char *getparent(char *s)
  193. {
  194.   int l;
  195.   char *outname;
  196.  
  197.   if (outname=strdup(s))
  198.   {
  199.     addterm(outname);
  200.     l=strlen(outname);
  201.  
  202.     if (outname[l-1]=='/')
  203.     {
  204.       l--;
  205.       while (outname[l-1]!='/' && outname[l-1]!=':') l--;
  206.       outname[l]='\0';
  207.     }
  208.   }
  209.   return(outname);
  210. }
  211.  
  212. char *upcase(char *str)
  213. {
  214.   // converts str into uppercase and returns a pointer to a new
  215.   // string.
  216.   // returns NULL if it fails.
  217.  
  218.   char *outstr;
  219.   short loop;
  220.  
  221.   if (outstr=strdup(str))
  222.   {
  223.     for (loop=0;str[loop];loop++) outstr[loop]=toupper(str[loop]);
  224.   }
  225.   return(outstr);
  226. }
  227.  
  228. short position(char *substr,char *str)
  229. {
  230.   // returns an character offset of a substring in a string
  231.   // this version is CASE SENSITIVE
  232.   // returns -1 if substring not found in the string
  233.  
  234.   char *whstr;
  235.   return((short)((whstr=strstr(str,substr)) ? (short)((LONG)whstr-(LONG)str) : -1));
  236. }
  237.  
  238. short iposition(char *substr,char *str)
  239. {
  240.   // returns an character offset of a substring in a string
  241.   // this version is CASE INSENSITIVE
  242.   // returns -1 if substring not found in the string
  243.   //      or -2 if memory allocation error
  244.  
  245.   short where=-2;
  246.   char *isubstr,*istr;
  247.  
  248.   if (isubstr=upcase(substr))
  249.   {
  250.     if (istr=upcase(str))
  251.     {
  252.       where=position(isubstr,istr);
  253.       free(isubstr);
  254.     }
  255.     free(istr);
  256.   }
  257.   return(where);
  258. }
  259.  
  260. void removeinfo( char *str)
  261. {
  262.   short slen;
  263.  
  264.   // i know this looks tacky but it's fast and small... :-)
  265.  
  266.   slen=strlen(str)-1;
  267.   if (toupper(str[slen])=='O' &&
  268.       toupper(str[slen-1])=='F' &&
  269.       toupper(str[slen-2])=='N' &&
  270.       toupper(str[slen-3])=='I' &&
  271.       toupper(str[slen-4])=='.')
  272.   {
  273.     str[slen-4]=0;
  274.   }
  275. }
  276.  
  277. void DoInfo( char *fname)
  278. {
  279.   BPTR FL;
  280.   char *drawername;
  281.   char *filename;
  282.   char *wholestr;
  283.  
  284.   if (WorkbenchBase->lib_Version>=39)
  285.   {
  286.     if (wholestr=strdup(fname))
  287.     {
  288.       if (wholestr[0])
  289.       {
  290.         removeinfo(wholestr);
  291.         drawername=getparent(wholestr);
  292.         filename=FilePart(wholestr);
  293.         if (FL=Lock(drawername,ACCESS_READ))
  294.         {
  295.           WBInfo(FL,filename,Scr);
  296.           UnLock(FL);
  297.         }
  298.         free(drawername);
  299.       }
  300.       free(wholestr);
  301.     }
  302.   }
  303.   else rtEZRequest("Sorry, You Need WB 3.0+ to access Icon Info","Damn!",NULL,NULL);
  304. }
  305.  
  306. int IconInfoClicked( void )
  307. {
  308.   /* routine when gadget "Icon Info" is clicked. */
  309.   if (temptnode=FindTypeNode())
  310.   {
  311.     if (temptnode->IconName)
  312.     {
  313.       DoInfo(temptnode->IconName);
  314.     }
  315.   }
  316.   return(1);
  317. }
  318. int IconRunClicked( void )
  319. {
  320.   /* routine when gadget "Run Info When activated" is clicked. */
  321.  
  322.   if (temptnode=FindTypeNode())
  323.   {
  324.     GT_GetGadgetAttrs(AssociateGadgets[GD_IconRun],AssociateWnd,NULL,
  325.                       GTCB_Checked,&temptnode->RunInfo,
  326.                       TAG_DONE);
  327.   }
  328.   return(1);
  329. }
  330.  
  331. int TypeAddClicked( void )
  332. {
  333.   /* routine when gadget "Add" is clicked. */
  334.  
  335.   char *tmpstr;
  336.  
  337.   if (tmpstr=AllocMem(256,MEMF_PUBLIC|MEMF_CLEAR)) //MEMF_CLEAR to nullify string..
  338.   {
  339.     if (rtGetString(tmpstr,255, "Enter File Type Name", NULL,RT_Window,AssociateWnd, TAG_END))
  340.     {
  341.       NewTypeNode(typelist,tmpstr);
  342.       UpdateLists();
  343.     }
  344.     FreeMem(tmpstr,256);
  345.   }
  346.   return(1);
  347. }
  348.  
  349. int TypeDeleteClicked( void )
  350. {
  351.   /* routine when gadget "Delete" is clicked. */
  352.   if (temptnode=FindTypeNode())
  353.   {
  354.     if (rtEZRequest("Sure ?","Yeah!|No Way!",NULL,NULL))
  355.     {
  356.       FreeTypeNode(temptnode);
  357.       Remove((struct Node*)temptnode);
  358.       FreeMem(temptnode,sizeof(struct TypeNode));
  359.       UpdateLists();
  360.     }
  361.   }
  362.   return(1);
  363. }
  364.  
  365. int NamePAddClicked( void )
  366. {
  367.   /* routine when gadget "Add" is clicked. */
  368.   char *tmpstr;
  369.   if (temptnode=FindTypeNode())
  370.   {
  371.     if (tmpstr=AllocMem(256,MEMF_PUBLIC|MEMF_CLEAR)) //MEMF_CLEAR to nullify string..
  372.     {
  373.       if (rtGetString(tmpstr,255, "Enter Name Match String", NULL,RT_Window,AssociateWnd, TAG_END))
  374.       {
  375.         NewNameNode(temptnode->nameplist,tmpstr);
  376.         GT_SetGadgetAttrs(AssociateGadgets[GD_NamePList], AssociateWnd, NULL,
  377.                           GTLV_Labels, (ULONG)temptnode->nameplist,
  378.                           TAG_END);
  379.       }
  380.     }
  381.     FreeMem(tmpstr,256);
  382.   }
  383.   return(1);
  384. }
  385.  
  386. int NamePDeleteClicked( void )
  387. {
  388.   /* routine when gadget "Delete" is clicked. */
  389.  
  390.   LONG num;
  391.   struct Node *node;
  392.  
  393.   if (temptnode=FindTypeNode())
  394.   {
  395. #ifdef KS30
  396.     if (1==GT_GetGadgetAttrs(AssociateGadgets[GD_NamePList],AssociateWnd,NULL,
  397.                     GTLV_Selected,&num,
  398.                     TAG_DONE))
  399.     {
  400. #endif
  401.  
  402. #ifdef KS20
  403.     num=LastNamePClicked;
  404. #endif
  405.  
  406.       if (num>=0)
  407.       {
  408.         node=GetNode(temptnode->nameplist,num);
  409.         FreeNameNode(node);
  410.         Remove(node);
  411.         FreeMem(node,sizeof(struct Node));
  412.         UpdateLists();
  413.       }
  414. #ifdef KS30
  415.     }
  416. #endif
  417.   }
  418.  
  419.   return(1);
  420. }
  421.  
  422. int FilePAddClicked( void )
  423. {
  424.   /* routine when gadget "Add" is clicked. */
  425.  
  426.   char *tmpstr;
  427.  
  428.   if (temptnode=FindTypeNode())
  429.   {
  430.     if (tmpstr=AllocMem(256,MEMF_PUBLIC|MEMF_CLEAR)) //MEMF_CLEAR to nullify string..
  431.     {
  432.       if (rtGetString(tmpstr,255, "Enter File Match String", NULL,RT_Window,AssociateWnd, TAG_END))
  433.       {
  434.         NewNameNode(temptnode->fileplist,tmpstr);
  435.         GT_SetGadgetAttrs(AssociateGadgets[GD_FilePList], AssociateWnd, NULL,
  436.                           GTLV_Labels, (ULONG)temptnode->fileplist,
  437.                           TAG_END);
  438.       }
  439.     }
  440.     FreeMem(tmpstr,256);
  441.   }
  442.   return(1);
  443. }
  444.  
  445. int FilePDeleteClicked( void )
  446. {
  447.   /* routine when gadget "Delete" is clicked. */
  448.   LONG num;
  449.   struct Node *node;
  450.  
  451.   if (temptnode=FindTypeNode())
  452.   {
  453. #ifdef KS30
  454.  
  455.     if (1==GT_GetGadgetAttrs(AssociateGadgets[GD_FilePList],AssociateWnd,NULL,
  456.                     GTLV_Selected,&num,
  457.                     TAG_DONE))
  458.     {
  459. #endif
  460. #ifdef KS20
  461.     num=LastFilePClicked;
  462. #endif
  463.       if (num>=0)
  464.       {
  465.         node=GetNode(temptnode->fileplist,num);
  466.         FreeNameNode(node);
  467.         Remove(node);
  468.         FreeMem(node,sizeof(struct Node));
  469.         UpdateLists();
  470.       }
  471. #ifdef KS30
  472.     }
  473. #endif
  474.   }
  475.   return(1);
  476. }
  477.  
  478. int SaveClicked( void )
  479. {
  480.   /* routine when gadget "Save" is clicked. */
  481.   SavePrefs();
  482.   return(1);
  483. }
  484.  
  485. int HelpClicked( void )
  486. {
  487.   /* routine when gadget "Help" is clicked. */
  488.   static ULONG sysargs[] =
  489.   {
  490.     SYS_Input,NULL,
  491.     SYS_Output,NULL,
  492.     SYS_Asynch,FALSE,
  493.     SYS_UserShell,TRUE,
  494.     NP_Priority,0L,
  495.     TAG_DONE
  496.   };
  497.  
  498.   if (SystemTagList("AmigaGuide Associate.Guide",(struct TagItem *)sysargs)!=0)
  499.   {
  500.     if (SystemTagList("AmigaGuide progdir:Associate.Guide",(struct TagItem *)sysargs)!=0)
  501.     {
  502.       rtEZRequest("Sorry, I Can't find AmigaGuide\n"
  503.                   "and/or the Assoiciate.Guide file",okstr,NULL,NULL);
  504.     }
  505.   }
  506.   return(1);
  507. }
  508.  
  509. int OKClicked( void )
  510. {
  511.   /* routine when gadget "OK" is clicked. */
  512.   return(0);
  513. }
  514.  
  515. int TypeEditClicked( void )
  516. {
  517.   /* routine when gadget "Edit" is clicked. */
  518.   LONG num;
  519.   struct Node *node;
  520. #ifdef KS30
  521.  
  522.   if (1==GT_GetGadgetAttrs(AssociateGadgets[GD_TypeList],AssociateWnd,NULL,
  523.                   GTLV_Selected,&num,
  524.                   TAG_DONE))
  525.   {
  526. #endif
  527. #ifdef KS20
  528.   num=LastTypeClicked;
  529. #endif
  530.     if (num>=0)
  531.     {
  532.       node=GetNode(typelist,num);
  533.       if (rtGetString(node->ln_Name,255, "Edit Filetype Name", NULL,RT_Window,AssociateWnd, TAG_END))
  534.       {
  535.         GT_SetGadgetAttrs(AssociateGadgets[GD_TypeList], AssociateWnd, NULL,
  536.                           GTLV_Labels, (ULONG)typelist,
  537.                           TAG_END);
  538.       }
  539. #ifdef KS30
  540.     }
  541. #endif
  542.   }
  543.   return(1);
  544. }
  545.  
  546. int NamePEditClicked( void )
  547. {
  548.   /* routine when gadget "Edit" is clicked. */
  549.   LONG num;
  550.   struct Node *node;
  551.  
  552.   if (temptnode=FindTypeNode())
  553.   {
  554. #ifdef KS30
  555.     if (1==GT_GetGadgetAttrs(AssociateGadgets[GD_NamePList],AssociateWnd,NULL,
  556.                     GTLV_Selected,&num,
  557.                     TAG_DONE))
  558.     {
  559. #endif
  560. #ifdef KS20
  561.     num=LastNamePClicked;
  562. #endif
  563.       if (num>=0)
  564.       {
  565.         node=GetNode(temptnode->nameplist,num);
  566.         if (rtGetString(node->ln_Name,255, "Edit Match String", NULL,RT_Window,AssociateWnd, TAG_END))
  567.         {
  568.           GT_SetGadgetAttrs(AssociateGadgets[GD_NamePList], AssociateWnd, NULL,
  569.                             GTLV_Labels, (ULONG)temptnode->nameplist,
  570.                             TAG_END);
  571.         }
  572.       }
  573. #ifdef KS30
  574.     }
  575. #endif
  576.   }
  577.   return(1);
  578. }
  579.  
  580. int FilePEditClicked( void )
  581. {
  582.   /* routine when gadget "Edit" is clicked. */
  583.   LONG num;
  584.   struct Node *node;
  585.  
  586.   if (temptnode=FindTypeNode())
  587.   {
  588. #ifdef KS30
  589.     if (1==GT_GetGadgetAttrs(AssociateGadgets[GD_FilePList],AssociateWnd,NULL,
  590.                     GTLV_Selected,&num,
  591.                     TAG_DONE))
  592.     {
  593. #endif
  594. #ifdef KS20
  595.       num=LastFilePClicked;
  596. #endif
  597.       if (num>=0)
  598.       {
  599.         node=GetNode(temptnode->fileplist,num);
  600.         if (rtGetString(node->ln_Name,255, "Edit Match String", NULL,RT_Window,AssociateWnd, TAG_END))
  601.         {
  602.           GT_SetGadgetAttrs(AssociateGadgets[GD_FilePList], AssociateWnd, NULL,
  603.                             GTLV_Labels, (ULONG)temptnode->fileplist,
  604.                             TAG_END);
  605.         }
  606.       }
  607. #ifdef KS30
  608.     }
  609. #endif
  610.   }
  611.   return(1);
  612. }
  613.  
  614. int AssociateItem0( void )
  615. {
  616.   /* routine when (sub)item "About" is selected. */
  617.   DoAbout();
  618.   return(1);
  619. }
  620.  
  621. int AssociateItem1( void )
  622. {
  623.   /* routine when (sub)item "Quit!" is selected. */
  624.   done=TRUE;
  625.   return(0);
  626. }
  627.  
  628. int AssociateCloseWindow( void )
  629. {
  630.   /* routine for "IDCMP_CLOSEWINDOW". */
  631.   return(0);
  632. }
  633.  
  634.  
  635. int PickTypeClicked( void )
  636. {
  637.   /* routine when gadget "" is clicked. */
  638. #ifdef KS20
  639.   LastPickClicked=PickMsg.Code;
  640. #endif
  641.   return(1);
  642. }
  643.  
  644. int PickOkClicked( void )
  645. {
  646.   /* routine when gadget "Ok!" is clicked. */
  647.  
  648.   LONG num;
  649.   int retval=1;
  650. #ifdef KS30
  651.   if (1==GT_GetGadgetAttrs(PickGadgets[GD_PickType],PickWnd,NULL,
  652.                            GTLV_Selected,&num,
  653.                            TAG_DONE))
  654.   {
  655. #endif
  656. #ifdef KS20
  657.       num=LastPickClicked;
  658. #endif
  659.     if (num>=0)
  660.     {
  661.       temptnode=(struct TypeNode *) GetNode(typelist,num);
  662.       retval=0;
  663.     }
  664. #ifdef KS30
  665.   }
  666. #endif
  667.   return(retval);
  668. }
  669.  
  670. int PickCancelClicked( void )
  671. {
  672.   /* routine when gadget "Cancel" is clicked. */
  673.   temptnode=NULL;
  674.   return(0);
  675. }
  676.  
  677. int PickCloseWindow( void )
  678. {
  679.   /* routine for "IDCMP_CLOSEWINDOW". */
  680.   // hmm.  does this funtion get called when there is no close gadget ?
  681.   return(0);
  682. }
  683.  
  684. int PickVanillaKey( void )
  685. {
  686.   /* routine for "IDCMP_VANILLAKEY". */
  687.   switch (PickMsg.Code)
  688.   {
  689.     case 13:
  690.       return(PickOkClicked());
  691.       break;
  692.     case 27:
  693.       temptnode=NULL;
  694.       return(0);
  695.       break;
  696.   }
  697.   return(1);
  698. }
  699.